/**
 * 
 */
package com.ez.supervise.core;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
 
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * @author searph.wang
 * @email searph.wang@gmail.com
 * @Created at 2009-7-27
 * 
 */
public class MyUtils {

    public static void main(String[] s) {
	List conditions = new ArrayList();
	MyUtils.addToCollection(conditions, MyUtils.split("a,b-c d,e f-g", " ,-"));
	System.out.println(conditions);// output[a, b, c, d, e, f, g]
    }

    /**
     * 删除文件
     * 
     * @param filePathAndName
     *            String 文件路径及名称 如c:/fqf.txt
     * @param fileContent
     *            String
     * @return boolean
     */
    public static boolean delFile(String filePathAndName) {
	File myDelFile = new java.io.File(filePathAndName);
	if (!myDelFile.exists()) {
	    return true;
	}
	return myDelFile.delete();
    }

    /**
     * 上传文件
     * 
     * @param uploadFileName
     *            被上传的文件名称
     * @param savePath
     *            文件的保存路径
     * @param uploadFile
     *            被上传的文件
     * @return newFileName
     */
    public static String upload(String uploadFileName, String savePath, File uploadFile) {
	String newFileName = getRandomName(uploadFileName, savePath);
	try {
	    FileOutputStream fos = new FileOutputStream(savePath + newFileName);
	    FileInputStream fis = new FileInputStream(uploadFile);
	    byte[] buffer = new byte[1024];
	    int len = 0;
	    while ((len = fis.read(buffer)) > 0) {
		fos.write(buffer, 0, len);
	    }
	} catch (FileNotFoundException e) {
	    e.printStackTrace();
	} catch (IOException e) {
	    e.printStackTrace();
	}
	return newFileName;
    }

    /**
     * 根据路径创建一系列的目录
     * 
     * @param path
     */
    public static void mkDirectory(String path) {
	File file;
	try {
	    file = new File(path);
	    if (!file.exists()) {
		file.mkdirs();
	    }
	} catch (RuntimeException e) {
	    e.printStackTrace();
	} finally {
	    file = null;
	}
    }

    /**
     * 将对象数组的每一个元素分别添加到指定集合中,调用Apache commons collections 中的方法
     * 
     * @param collection
     *            目标集合对象
     * @param arr
     *            对象数组
     */
    public static void addToCollection(Collection collection, Object[] arr) {
	if (null != collection && null != arr) {
	    CollectionUtils.addAll(collection, arr);
	}
    }

    /**
     * 将字符串已多个分隔符拆分为数组,调用Apache commons lang 中的方法
     * 
     * <pre>
     *    Example:
     *     String[] arr = StringUtils.split(&quot;a b,c d,e-f&quot;, &quot; ,-&quot;);
     *     System.out.println(arr.length);//输出6
     * </pre>
     * 
     * @param str
     *            目标字符串
     * @param separatorChars
     *            分隔符字符串
     * @return 字符串数组
     */
    public static String[] split(String str, String separatorChars) {
	return StringUtils.split(str, separatorChars);
    }

    /**
     * 调用指定字段的setter方法
     * 
     * <pre>
     *    Example:
     *    User user = new User();
     *    MyUtils.invokeSetMethod(&quot;userName&quot;, user, new Object[] {&quot;张三&quot;});
     * </pre>
     * 
     * @param fieldName
     *            字段(属性)名称
     * @param invokeObj
     *            被调用方法的对象
     * @param args
     *            被调用方法的参数数组
     * @return 成功与否
     */
    public static boolean invokeSetMethod(String fieldName, Object invokeObj, Object[] args) {
	boolean flag = false;
	Field[] fields = invokeObj.getClass().getDeclaredFields(); // 获得对象实体类中所有定义的字段
	Method[] methods = invokeObj.getClass().getDeclaredMethods(); // 获得对象实体类中所有定义的方法
	for (Field f : fields) {
	    String fname = f.getName();
	    if (fname.equals(fieldName)) {// 找到要更新的字段名
		String mname = "set" + (fname.substring(0, 1).toUpperCase() + fname.substring(1));// 组建setter方法
		for (Method m : methods) {
		    String name = m.getName();
		    if (mname.equals(name)) {
			// 处理Integer参数
			if (f.getType().getSimpleName().equalsIgnoreCase("integer") && args.length > 0) {
			    args[0] = Integer.valueOf(args[0].toString());
			}
			// 处理Boolean参数
			if (f.getType().getSimpleName().equalsIgnoreCase("boolean") && args.length > 0) {
			    args[0] = Boolean.valueOf(args[0].toString());
			}
			try {
			    m.invoke(invokeObj, args);
			    flag = true;
			} catch (IllegalArgumentException e) {
			    flag = false;
			    e.printStackTrace();
			} catch (IllegalAccessException e) {
			    flag = false;
			    e.printStackTrace();
			} catch (InvocationTargetException e) {
			    flag = false;
			    e.printStackTrace();
			}
		    }
		}
	    }
	}
	return flag;
    }

    /**
     * 判断文件是否存在
     * 
     * @param fileName
     * @param dir
     * @return
     */
    public static boolean isFileExist(String fileName, String dir) {
	File files = new File(dir + fileName);
	return (files.exists()) ? true : false;
    }

    /**
     * 获得随机文件名,保证在同一个文件夹下不同名
     * 
     * @param fileName
     * @param dir
     * @return
     */
    public static String getRandomName(String fileName, String dir) {
	String[] split = fileName.split("\\.");// 将文件名已.的形式拆分
	String extendFile = "." + split[split.length - 1].toLowerCase(); // 获文件的有效后缀

	Random random = new Random();
	int add = random.nextInt(1000000); // 产生随机数10000以内
	String ret = add + extendFile;
	while (isFileExist(ret, dir)) {
	    add = random.nextInt(1000000);
	    ret = fileName + add + extendFile;
	}
	return ret;
    }

    /**
     * 创建缩略图
     * 
     * @param file
     *            上传的文件流
     * @param height
     *            最小的尺寸
     * @throws IOException
     */
    public static void createMiniPic(File file, float width, float height) throws IOException {
	Image src = javax.imageio.ImageIO.read(file); // 构造Image对象
	int old_w = src.getWidth(null); // 得到源图宽
	int old_h = src.getHeight(null);
	int new_w = 0;
	int new_h = 0; // 得到源图长
	float tempdouble;
	if (old_w >= old_h) {
	    tempdouble = old_w / width;
	} else {
	    tempdouble = old_h / height;
	}

	if (old_w >= width || old_h >= height) { // 如果文件小于锁略图的尺寸则复制即可
	    new_w = Math.round(old_w / tempdouble);
	    new_h = Math.round(old_h / tempdouble);// 计算新图长宽
	    while (new_w > width && new_h > height) {
		if (new_w > width) {
		    tempdouble = new_w / width;
		    new_w = Math.round(new_w / tempdouble);
		    new_h = Math.round(new_h / tempdouble);
		}
		if (new_h > height) {
		    tempdouble = new_h / height;
		    new_w = Math.round(new_w / tempdouble);
		    new_h = Math.round(new_h / tempdouble);
		}
	    }
	    BufferedImage tag = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
	    tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null); // 绘制缩小后的图
	    FileOutputStream newimage = new FileOutputStream(file); // 输出到文件流
	    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
	    JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(tag);
	    param.setQuality((float) (100 / 100.0), true);// 设置图片质量,100最大,默认70
	    encoder.encode(tag, param);
	    encoder.encode(tag); // 将JPEG编码
	    newimage.close();
	}
    }

    /**
     * 判断文件类型是否是合法的,就是判断allowTypes中是否包含contentType
     * 
     * @param contentType
     *            文件类型
     * @param allowTypes
     *            文件类型列表
     * @return 是否合法
     */
    public static boolean isValid(String contentType, String[] allowTypes) {
	if (null == contentType || "".equals(contentType)) {
	    return false;
	}
	for (String type : allowTypes) {
	    if (contentType.equals(type)) {
		return true;
	    }
	}
	return false;
    }
}
